home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / programming / other / tandem / teaching / 22.asm < prev    next >
Assembly Source File  |  1999-09-06  |  2KB  |  46 lines

  1. * 22.asm     make program runnable from workbench      version 0.00  1.9.97
  2.  
  3.  include 'IncAll.i'    ;pre-assembles all Amiga OS3.1 includes, and _LVO's
  4.  
  5.  move.l _AbsExecBase,a6 ;find task structure for this program
  6.  sub.l a1,a1           ;a1=0 means "find my own task structure"
  7.  jsr _LVOFindTask(a6)  ;puts task address in d0
  8.  move.l d0,a2          ;put in a2 so we can look at elements of task struct
  9.  clr.w workbench       ;will be <>0 if started from workbench
  10.  tst.l pr_CLI(a2)      ;<>0 if from CLI, else from workbench
  11.  bne.s Cli             ;go if CLI
  12.  subq.w #1,workbench   ;remember from workbench
  13.  lea pr_MsgPort(a2),a0 ;wait for workbench startup message at pr_MsgPort
  14.  jsr _LVOWaitPort(a6)  ;does not return until a message is there
  15.  lea pr_MsgPort(a2),a0 ;now, get the workbench startup message at pr_MsgPort
  16.  jsr _LVOGetMsg(a6)    ;puts message in d0 (= the addr of a message struct)
  17.  move.l d0,message     ;remember the message, for replying
  18. Cli:
  19.  lea intname,a1        ;open intuition.library
  20.  moveq #37,d0          ;version 37+ (i.e. release 2.04+)
  21.  jsr _LVOOpenLibrary(a6) ;puts the library address in d0
  22.  move.l d0,intbase     ;remember where the intuition library base is
  23.  beq.s Abort           ;quit if can't open (unlikely!)
  24.  move.l d0,a6          ;a6 = intuition library base
  25.  sub.l a0,a0           ;a0=0 to make DisplyBeep beep all screens
  26.  jsr _LVODisplayBeep(a6) ;beep all screens
  27.  move.l _AbsExecBase,a6  ;a6 = exec library base
  28.  tst.w workbench       ;go if CLI
  29.  beq.s Cliback
  30.  jsr _LVOForbid(a6)    ;stop multi-tasking until RTS  * This is the ONLY
  31.  move.l message,a1     ;retrieve the startup message  * context you should
  32.  jsr _LVOReplyMsg(a6)  ;reply to it                   * use _LVOForbid!!
  33. Cliback:
  34.  move.l intbase,a1     ;close intuition.library
  35.  jsr _LVOCloseLibrary(a6)
  36.  clr.l d0              ;return ok
  37.  rts                   ;(exit from program cancels effect of _LVOForbid)
  38. Abort:
  39.  moveq #-1,d0          ;return bad if couldn't open library
  40.  rts
  41.  
  42. workbench: ds.w 1 ;<>0 if from workbench, else from CLI
  43. message: ds.l 1   ;workbench startup message (meaningless if from CLI)
  44. intname: dc.b 'intuition.library',0  ;use to open the intuition library
  45. intbase: ds.l 1                      ;the base of the intuition library
  46.